#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<ctime>
using namespace std;
const int N=5e6+10;
int nums[N];
int select_rand(int start,int end)
{
	return rand()%(end-start+1)+start;
}
int quick_select(int start,int end,int k)
{
	if(start==end)
	{
		return nums[start];
	}
	int p=select_rand(start,end);

	int l=start-1,r=end+1,mid=start;

	while(mid<r)
	{
		if(nums[mid]<nums[p])
		{
			nums[++l]=nums[mid++];
		}
		else if(nums[mid]==nums[p])
		{
			mid++;
		}
		else
		{
			swap(nums[mid],nums[--r]);
		}
	}

	if(k<=l)
	{
		return quick_select(start,l,k);
	}
	else if(k<r)
	{
		return nums[p];
	}
	else
	{
		return quick_select(r,end,k);
	}
}
int main()
{
	srand(time(0));
	int n,k;cin>>n>>k;
	//1.简单排序
	// for(int i=0;i<n;i++)
	// {
	// 	cin>>nums[i];
	// }
	// sort(nums,nums+n);
	// cout<<nums[k]<<endl;

	//2.最小堆
	// priority_queue<int ,vector<int>,less<int>> q;
	// for(int i=0;i<n;i++)
	// {
	// 	int a;cin>>a;
	// 	q.push(a);
	// 	if(q.size()>k+1)
	// 	{
	// 		q.pop();
	// 	}
	// }
	// cout<<q.top()<<endl;

	//3.快速选择
	for(int i=0;i<n;i++)
	{
		cin>>nums[i];
	}
	cout<<quick_select(0,n-1,k)<<endl;
}